//permission.js(权限)，主要负责路由导航守卫
import router from '@/router'
import nprogress from 'nprogress'
import 'nprogress/nprogress.css'
import store from '@/store'
import {asyncRouters} from '@/router'

/**
 *前置守卫
 *
*/
//设置白名单为登录和404页面
const whiteList = ['/login', '/404']
router.beforeEach(async(to, from, next) => {
  nprogress.start()//进度条
  if (store.getters.token) {
    // 存在token1
    if (to.path === '/login') {   //如果用户已登录且尝试访问登录页，重定向到主页
      // 跳转到主页
      next('/') // 中转到主页
      // next（地址）并没有执行后置守卫
      nprogress.done()
    
    } else {
      // 判断是否获取过资料
    //  userId:state=> state.user.userInfo.userId
      if (!store.getters.userId) {
      const {roles}=await store.dispatch('user/getUserInfo')  //去user/的getUserInfo接口中获取数据
      // console.log(roles.menus);//数组不确定
      // console.log(asyncRouters);//数组 8个
      //打印了result看浏览器。
  const filterRouters=asyncRouters.filter(item=>{
      return roles.menus.includes(item.name)
      })//过滤出符合条件的路由
      store.commit('user/setRoutes',filterRouters)
     router.addRoutes([...filterRouters,{ path: '*', redirect: '/404', hidden: true }]);//添加动态路由信息
     
     //router添加动态路由之后，需要转发一下
    next(to.path)//让路由拥有信息 router的一直缺陷
      }else{
      next() // 放过
    }
  }
  } else {
    // 没有token
    if (whiteList.includes(to.path)) {
      next()
    } else {
      next('/login') // 中转到登录页
      nprogress.done()
    }
  }
})








// import router from '@/router';
// import nprogress from 'nprogress';
// import 'nprogress/nprogress.css';
// import store from '@/store';
// import { asyncRouters } from '@/router';

// // 定义白名单路由，这些路由无需 token 即可访问
// const whiteList = ['/login', '/404'];

// // 全局前置守卫，在每次路由跳转前执行
// router.beforeEach(async (to, from, next) => {
//     // 启动进度条
//     nprogress.start();

//     // 检查是否存在 token
//     if (store.getters.token) {
//         // 如果目标路由是登录页，重定向到首页
//         if (to.path === '/login') {
//             next('/');
//             // 完成进度条
//             nprogress.done();
//         } else {
//             // 检查是否已经获取过用户信息
//             if (!store.getters.userId) {
//                 try {
//                     // 异步获取用户信息
//                     const { roles } = await store.dispatch('user/getUserInfo');
//                     // 过滤出符合用户角色权限的动态路由
//                     const filterRouters = asyncRouters.filter(item => {
//                         return roles.menus.includes(item.name);
//                     });
//             //筛选后的路由
//             store.commit('user/setRoutes', filterRouters);

//                     // 使用 addRoutes 方法添加过滤后的动态路由
//                     router.addRoutes({filterRouters});
//                     // ,{ path: '*', redirect: '/404', hidden: true 

//                     // 重新导航到目标路由，避免无限循环
//                     next({ ...to, replace: true });
//                 } catch (error) {
//                     // 处理获取用户信息失败的情况，打印错误信息并跳转到登录页
//                     console.error('获取用户信息失败:', error);
//                     next('/login');
//                     // 完成进度条
//                     nprogress.done();
//                 }
//             } else {
//                 // 如果已经获取过用户信息，直接放行
//                 next();
//             }
//         }
//     } else {
//         // 如果没有 token
//         if (whiteList.includes(to.path)) {
//             // 如果目标路由在白名单中，直接放行
//             next();
//         } else {
//             // 否则，重定向到登录页
//             next('/login');
//             // 完成进度条
//             nprogress.done();
//         }
//     }
// });